# encoding=utf-8

import warnings

warnings.filterwarnings('ignore')
#显示中文
from pylab import *  #显示中文

mpl.rcParams['font.sans-serif'] = ['SimHei']  #显示中文
#画图中显示负号
import matplotlib

matplotlib.rcParams['axes.unicode_minus'] = False

# 1、	使用sklearn，调用iris数据（10分）
from sklearn import datasets
iris = datasets.load_iris()

# 2、	将数据分为x，y（10分）
X, y = iris.data, iris.target

# 3、	使用PCA降维，将特征降维成三维（10分）
from sklearn.decomposition import PCA
pca = PCA(n_components=3)
pca.fit(X)                                  # 训练模型
pca_new = pca.transform(X)                  # 生成降维后的新数据

# 4、	打印降维后各特征方差比例（10分）
print(pca.explained_variance_ratio_)
# 5、	打印降维后各特征方差（10分）
print(pca.explained_variance_)
# 6、	使用转置方式将特征数据还原（10分）
pca_rec = pca.inverse_transform(pca_new)     # 利用inverse_transform还原数据

# 7、	使用SVD，将数据降成二维（10分）
from numpy.linalg import svd
#计算协方差矩阵
X_mean= X - np.mean(X,0)
X_= X_mean.T
cov=np.cov(X_)   # cov(X)的X需要的shape(n,m), n:特征，m: 样本个数

#调用linalg.svd函数，计算特征值和特征向量
U,S,V = svd(cov)   # 特征值矩阵U,特征向量矩阵S
# 取前K列降维
U_reduced = U[:,:2]  #取前2个列向量降维

# 生成新的降维后的数据Z
svd_new_data = np.dot(X_mean,U_reduced)  # 要用X_mean均值

# 8、	使用散点图，绘制降维后数据和y的关系
# a)	X轴为降维后第一个数据，y轴为降维后第二个数据（10分）
# b)	颜色使用y标签确定（10分）
# c)	显示图像（10分）
color = ['r', 'b', 'g']
for i in set(y):
    plt.scatter(svd_new_data[y == i, 0], svd_new_data[y == i, 1], c = color[i])
plt.show()

